TODO :
- Vérifier qu’il n’y a plus de TODO dans le fichier.
- Ajouter des images, diagrammes et extraits de code.
- Ajouter des échantillons de données pour expliciter chaque étape.


1 Introduction

1.1 Problématique

Prédire les résultats d’éléctions présidentielles française d’un bureau de vote, dans l’idéal. Mais en réalité le but était surtout de trouver des correlations et dépendances entre les résultats d’éléctions présidentielles française d’un bureau de vote, et des données démographiques.

1.2 Cadre théorique

Les préférences politiques des individus peuvent être façonnées par des variables socio-démographiques telles que l’âge, le niveau d’éducation, la situation économique ou encore le lieu de résidence. Nous voulions essayer d’observer des tendances que créent ces cadres théoriques. Plusieurs cadres théoriques permettent de formuler des hypothèses sur ces influences potentielles.

La théorie de la socialisation politique suppose que des facteurs comme l’âge, le genre et la composition familiale jouent un rôle dans la formation des opinions politiques. Par exemple, on pourrait s’attendre à ce que les jeunes adultes soient plus attirés par des idées progressistes, tandis que les générations plus âgées privilégient des positions conservatrices, influencées par leurs expériences passées.

Les théories liées au clivage de classe sociale, inspirées par les travaux de Karl Marx et Pierre Bourdieu, postulent que la position des individus dans la hiérarchie socio-professionnelle peut orienter leurs préférences politiques. Les individus occupant des emplois manuels ou précaires pourraient être davantage sensibles aux discours en faveur de la justice sociale, tandis que les catégories socio-professionnelles supérieures seraient plus réceptives aux politiques favorisant l’investissement et la stabilité économique.

Le capital culturel, tel que défini par Pierre Bourdieu, pourrait également jouer un rôle dans le comportement électoral. Les niveaux de qualification peuvent influencer la perception des enjeux politiques : les personnes disposant d’un diplôme supérieur pourraient privilégier des valeurs universalistes et libérales, alors que les moins diplômés pourraient être plus sensibles aux discours protectionnistes ou nationalistes.

La théorie du contexte géographique met en avant l’importance du lieu de vie et des interactions sociales locales sur les comportements politiques. Les caractéristiques urbaines et rurales, la proportion de logements sociaux ou encore l’ancienneté des constructions peuvent être des indicateurs pertinents pour comprendre les dynamiques électorales locales.

La théorie de la privation relative suggère que les inégalités perçues entre les attentes des individus et leur situation réelle peuvent les amener à soutenir des mouvements politiques contestataires. Des indicateurs comme le taux de pauvreté, le niveau de vie ou la précarité de l’emploi pourraient refléter ce sentiment de frustration.

Enfin, la théorie du choix rationnel propose que les électeurs adoptent des comportements stratégiques, en cherchant à maximiser leurs bénéfices individuels à travers leurs choix politiques. Par exemple, les propriétaires immobiliers ou les ménages vivant seuls pourraient orienter leurs votes en fonction des politiques perçues comme avantageuses ou défavorables à leurs intérêts.

1.3 Modèle de l’étude

Quel lien existe entre les différents facteurs socio-démographiques et influencent-ils les choix politiques des citoyens ?

1.4 Objectifs de l’étude

L’objectif est d’explorer ces hypothèses théoriques en s’appuyant sur des données socio-démographiques et électorales de plusieurs années. Cette étape théorique permet de poser les bases d’une analyse empirique qui pourra confirmer ou infirmer ces hypothèses en fonction des observations. Nous étudierons les liens au travers de différentes techniques d’analyse statistiques.


2 Identification et récupération des données

2.1 Élections par bureau de vote

D’après le cadre théorique, la première étape consiste à collecter les résultats des élections présidentielles. Pour enrichir notre jeu de données, nous avons choisi de les détailler au niveau des bureaux de vote. La plateforme data.gouv.fr nous donne accès à ce type de données. Lors de chaque élection, environ 70 000 bureaux de vote partagent leurs résultats. Nous limiterons toutefois notre étude aux trois dernières élections présidentielles (2012, 2017 et 2022), ce qui sera largement suffisant pour répondre à notre problématique.

De plus, nous nous concentrerons uniquement sur les bureaux de vote situés en France métropolitaine afin de simplifier la visualisation des données sur une carte. Cette restriction n’a qu’un faible impact sur la représentativité globale du jeu de données.

2.2 Données socio-démographiques

À partir du cadre théorique, nous avons identifié plusieurs groupes de facteurs socio-démographiques susceptibles d’influencer les orientations politiques des individus :

  • Facteurs démographique : ce groupe comprend des variables telles que l’âge, le genre et la composition familiale. Ces éléments permettent d’évaluer l’impact de la socialisation politique, notamment l’influence des générations et des expériences de vie sur le comportement électoral.

  • Facteurs travail et revenus : ces variables incluent la catégorie socio-professionnelle, le type d’emploi (salarié ou indépendant), le taux d’activité et le niveau de vie. Elles permettent d’explorer le rôle des disparités économiques et de la hiérarchie sociale sur les préférences politiques, en lien avec la théorie du clivage de classe.

  • Facteurs éducation : le niveau de diplôme et les qualifications constituent des indicateurs clés du capital culturel. Ces données sont utiles pour comprendre la manière dont l’accès au savoir et la formation influencent la perception des enjeux politiques.

  • Facteurs lieu de vie : ce groupe comprend des variables liées au lieu de résidence, telles que la répartition urbaine ou rurale, la proportion de logements sociaux, et l’ancienneté des constructions. Ces éléments permettent d’examiner l’impact du contexte spatial et des interactions sociales locales sur le vote.

  • Facteurs conditions de vie : le taux de pauvreté, la précarité de l’emploi et la composition des ménages permettent de mesurer le sentiment de privation relative et son effet potentiel sur l’adhésion à des mouvements politiques contestataires.

  • Facteurs mode de vie : certaines variables, comme la propriété immobilière ou la structure des ménages (par exemple, vivre seul ou en famille), peuvent refléter des comportements électoraux stratégiques, en lien avec des choix rationnels visant à préserver ou à optimiser une situation personnelle.

Certaines de ces données ont été directement récupérées sur le site de l’INSEE, via des études ou des cartes interactives avec export de données (par exemple, statistiques-locales.insee.fr). Nous avons rencontré des difficultés pour obtenir des données complètes et précises, par exemple pour l’âge moyen des habitants. En effet, la donnée était séparée en tranches d’âge, ce qui ne correspondait pas exactement à notre besoin. De plus, ces tranches d’age étaient réduites à moins de 25 ans, 25-64 ans et plus de 65 ans. Nous avons donc dû nous contenter de ces données, en espérant qu’elles soient suffisantes pour notre étude.

Nous avons aussi rencontré des problèmes pour obtenir des données sur le niveau d’études, qui n’étaient pas disponibles pour toutes les années. Pour ces paramètres, nous avons choisi des laisser ces valeurs manquantes plutôt que de les calculer avec des valeurs approximatives. Cela nous permet de conserver une certaine rigueur dans notre analyse, nous laissant toujours la possibilité de revenir sur ce choix et d’imputer les données si besoin.

Les données socio-démographiques concernant les communes d’outre-mer n’ont pas été incluses dans notre étude, car il manquait trop de données pour être comparables avec celles de la France métropolitaine. Cela aurait introduit un biais dans notre analyse, en mélangeant des données provenant de contextes socio-économiques différents.

La grande majorité de ces données étant regroupées par commune, nous avons décidé de les répartir proportionnellement entre les bureaux de vote en fonction du nombre de votants.

Nous aurions aussi aimmé utiliser d’autres données, ou des jeux plus précis pour notre analyse, mais ces données étaient rapportés aux départements ou région et non par commune. Cela aurait nécessité un travail de fusion et de répartition des données plus complexe, que nous n’avons pas jugé utile pour notre étude.

En revanche, la collecte des données concernant les revenus, le lieu de vie et les conditions de vie a été plus complexe. Ces données sont fournies sous forme de « carreaux » géographiques de 200 mètres de côté. Il a donc été nécessaire de récupérer les contours géographiques des bureaux de vote, de convertir et harmoniser les formats de coordonnées (CRS), puis de fusionner ces ensembles de données. La librairie R sf a été utilisée pour effectuer ces opérations, notamment en croisant les carreaux de 200 mètres avec les contours des bureaux de vote. Cette tâche s’est avérée chronophage en raison du coût computationnel élevé des calculs nécessaires pour chaque opération. Certaines données ont dû être additionnées, d’autres moyennées. Une vérification finale a montré une perte de seulement 0,01 % des données, ce qui constitue un excellent résultat pour ce type de fusion géographique.


3 Nettoyage et fusion des données

Concernant le nettoyage des données, plusieurs étapes ont été nécessaires pour garantir la qualité et la cohérence des informations. Les données électorales et socio-démographiques ont été collectées auprès de différentes sources, nécessitant une harmonisation des formats et des variables. Nous avons d’abord sélectionné les colonnes pertinentes pour notre étude, en éliminant les doublons et les variables inutiles. Un travail de normalisation a été effectué pour uniformiser les noms des colonnes et faciliter les opérations de fusion et de jointure. Les données ont été vérifiées afin d’éviter les valeurs aberrantes et garantir leur cohérence. Certaines transformations ont également été effectuées pour faciliter la visualisation et les rendre compatibles avec notre modèle d’analyse.

Le point de centralisation des données finales est le code bureau de vote, un identifiant unique attribué à chaque bureau de vote.

3.1 Traitement des données électorales

Pour les résultats des élections, il a d’abord été nécessaire de transformer la liste des votes par candidat dans chaque bureau de vote en catégories agrégées correspondant aux principaux courants politiques : Extrême Gauche, Gauche, Centre, Droite et Extrême Droite. Cette étape permet de simplifier l’analyse des tendances politiques tout en conservant une granularité suffisante.

Une colonne “Code” a été ajoutée en combinant les codes du département, de la commune et du bureau de vote, ce qui facilite la fusion avec d’autres jeux de données. Certaines colonnes, telles que les noms des départements ou les pourcentages inutiles (ex. : % Abstentions/Inscrits), ont été supprimées pour alléger le jeu de données. Une colonne “nonExp” a été créée pour regrouper les bulletins blancs et nuls. Cette information nous aide à mieux comprendre les niveaux de participation et de contestation.

Les données finales ont été organisées de manière à regrouper les colonnes liées à chaque courant politique, en mettant en avant les variables principales (comme les pourcentages par votant, inscrits et suffrages exprimés).

Un extrait des données nettoyées et organisées est présenté ci-dessous :

Annee Code Libellé de la commune Votants nonExp VoixEG % Voix/VotantEG VoixG % Voix/VotantG VoixC % Voix/VotantC VoixD % Voix/VotantD VoixED % Voix/VotantED
2022 010010001 L'Abergement-Clémenciat 537 17 6 1.117318 107 19.92551 168 31.28492 47 8.752328 192 35.75419
2022 010020001 L'Abergement-de-Varey 175 4 5 2.857143 61 34.85714 60 34.28571 8 4.571429 37 21.14286
2022 010040001 Ambérieu-en-Bugey 863 23 12 1.390498 286 33.14021 183 21.20510 53 6.141367 306 35.45771

3.2 Traitement des données socio-démographiques

Concernant les facteurs socio-démographiques, certaines données étaient déjà disponibles au niveau des bureaux de vote, tandis que d’autres étaient regroupées au niveau communal. Ces dernières ont été réparties entre les bureaux de vote en suivant une répartition proportionnelle basée sur le nombre de votants, comme décrit précédemment. Les données ont ensuite été allégé et les colonnes renommés pour améliorer la lisibilité globale des données. Les colonnes inutiles ont été supprimé, pour éviter de garder des informations superflues.

Afin de préparer la visualisation de nos données sur des cartes, nous avons conservé un fichier spatial au format GeoJSON contenant les contours des bureaux de vote, identifiés par l’ID code_bureau_vote. Ce fichier, d’une taille de 600 Mo, a été isolé pour éviter de ralentir le traitement des données lors des analyses statistiques. En cas de besoin, il peut être facilement fusionné avec notre jeu de données pour générer des visualisations cartographiques.

Ces étapes ont permis de disposer d’un jeu de données homogène et prêt pour l’analyse statistique des corrélations entre les variables socio-démographiques et les résultats électoraux. Voici un échantillon des 72 colonnes finales :

code_bureau_vote votants non_exp voix_eg pourcentage_voix_votant_eg voix_g pourcentage_voix_votant_g voix_c pourcentage_voix_votant_c voix_d pourcentage_voix_votant_d voix_ed pourcentage_voix_votant_ed code_insee population_ratio libelle nb_25 nb_25_64 nb_65 prop_25 prop_25_64 prop_65 taux_nat taux_mort nb_non_scolarises part_non_peu_diplomes part_bepc_brevet part_cap_bep part_bac nb_h_total nb_f_total nb_h_15_24 nb_h_25_64 nb_h_65 nb_f_15_24 nb_f_25_64 nb_f_65 population_totale proportion_h proportion_f nb_emplois_lt taux_activite part_emplois_salaries part_agriculteurs part_emplois_non_salaries part_artisans part_commercants part_chefs_entreprise part_cadres part_prof_intermediaires part_employes part_ouvriers annees nb_menages nb_menages_pauvres nb_menages_seul nb_menages_5plus nb_menages_proprietaires nb_menages_monoparentaux niveau_vie_total surface_totale_logements nb_logements_collectifs nb_logements_maisons nb_log_avant_1945 nb_log_1945_1969 nb_log_1970_1989 nb_log_apres_1990 nb_log_date_inconnue nb_logements_sociaux part_bac2 part_bac3_4 part_bac5_plus
010010001 508 9 29 5.708661 125 24.6063 54 10.62992 165 32.48031 126 24.80315 01001 1.0000000 L'Abergement-Clémenciat 247.0000 409.000 128.0000 31.5 52.2 16.3 13.0 7.1 555.000 27.4 5.8 25.4 16.8 245.0000 231.0000 35.0000 163.0000 47.00000 32.000 148.0000 51.00000 476.000 0.515 0.485 73.0000 74.9 64.4 18.8 35.6 0.0 9.4 15.4 37.7 18.7 37.3 95.1 2008-2012 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
010020001 179 5 17 9.497207 49 27.3743 22 12.29050 48 26.81564 38 21.22905 01002 1.0000000 L'Abergement-de-Varey 59.0000 124.000 39.0000 26.5 56.0 17.5 18.6 11.4 169.000 15.6 3.4 22.3 18.4 72.0000 69.0000 7.0000 51.0000 14.00000 10.000 45.0000 13.00000 141.000 0.511 0.489 17.0000 78.5 44.4 51.5 55.6 0.0 0.0 48.5 0.0 0.0 61.1 92.2 2008-2012 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
010040001 800 19 118 14.750000 227 28.3750 74 9.25000 173 21.62500 189 23.62500 01004 0.1229445 Ambérieu-en-Bugey 589.2731 855.325 256.3393 34.6 50.3 15.1 14.2 7.6 1205.963 28.1 6.7 24.5 18.6 556.0781 532.1039 122.0839 350.6378 83.47933 110.773 333.9173 87.29061 1088.182 0.511 0.489 949.0088 74.4 90.6 0.1 9.4 5.5 11.2 26.9 33.0 23.4 55.2 90.3 2008-2012 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

4 Data Mining Descriptif

L’analyse des données doit être la plus précise possible. Pour cela, nous avons choisi de créer un jeu de données intermédiaire qui élimine la duplication des bureaux de vote sur plusieurs années. Nous sélectionnerons aléatoirement une seule observation par bureau de vote parmi différentes années afin d’éviter un biais de similitude. En effet, un bureau ayant historiquement voté à droite a de fortes chances de continuer à voter de la même manière, ce qui pourrait fausser l’analyse si nous incluons plusieurs observations temporelles sans ajustement.

Nous ajoutons également une variable score comprise entre 0 et 1, qui indique l’orientation politique moyenne :
- 0 correspond à l’extrême gauche,
- 0.5 représente le centre,
- 1 correspond à l’extrême droite.

data <- data %>%
  mutate(
    score_orientation = round(
        (voix_ed * 1 + voix_d * 0.75 + voix_c * 0.5 + voix_g * 0.25 + voix_eg * 0) /
          (voix_eg + voix_g + voix_c + voix_d + voix_ed),
        2
      )
  ) %>%
  filter(!is.na(score_orientation))

score_moyen <- mean(data$score_orientation)

# Intervalle de confiance
n <- length(data$score_orientation)
score_var <- var(data$score_orientation)
alpha <- 0.05
quant_stud <- qt(1-alpha/2, df=n-1)
borne_inf <- score_moyen - quant_stud * sqrt(score_var/n)
borne_sup <- score_moyen + quant_stud * sqrt(score_var/n)
paste(borne_inf, "<", score_moyen, "<", borne_sup)
## [1] "0.582033290776292 < 0.582397657293833 < 0.582762023811374"

Cela indique que l’orientation politique française actuelle se situe plutôt au centre-droit.

Notre objectif initial est d’explorer la corrélation entre le niveau de richesse et l’orientation politique. Les politiques de droite étant souvent perçues comme plus favorables aux personnes disposant de revenus élevés, il est raisonnable d’anticiper une corrélation positive entre un haut niveau de richesse et un soutien aux partis de droite.

4.1 Richesse

N’ayant pas de données sur le niveau de vie en 2012, nous ne séléctionnerons pas de datas sur cette année. Voici le dataset que nous utiliserons:

code_bureau_vote votants non_exp voix_eg pourcentage_voix_votant_eg voix_g pourcentage_voix_votant_g voix_c pourcentage_voix_votant_c voix_d pourcentage_voix_votant_d voix_ed pourcentage_voix_votant_ed code_insee population_ratio libelle nb_25 nb_25_64 nb_65 prop_25 prop_25_64 prop_65 taux_nat taux_mort nb_non_scolarises part_non_peu_diplomes part_bepc_brevet part_cap_bep part_bac nb_h_total nb_f_total nb_h_15_24 nb_h_25_64 nb_h_65 nb_f_15_24 nb_f_25_64 nb_f_65 population_totale proportion_h proportion_f nb_emplois_lt taux_activite part_emplois_salaries part_agriculteurs part_emplois_non_salaries part_artisans part_commercants part_chefs_entreprise part_cadres part_prof_intermediaires part_employes part_ouvriers annees nb_menages nb_menages_pauvres nb_menages_seul nb_menages_5plus nb_menages_proprietaires nb_menages_monoparentaux niveau_vie_total surface_totale_logements nb_logements_collectifs nb_logements_maisons nb_log_avant_1945 nb_log_1945_1969 nb_log_1970_1989 nb_log_apres_1990 nb_log_date_inconnue nb_logements_sociaux part_bac2 part_bac3_4 part_bac5_plus score_orientation
430890003 658 17 12 1.823708 163 24.772036 200 30.39514 170 25.835866 96 14.58967 43089 0.33417979 Espaly-Saint-Marcel 332.5089 583.8121 263.3337 28.2 49.5 22.3 10.4 11.4 NA NA NA NA NA 348.2153 365.9269 80.20315 199.8395 68.17268 85.55003 218.2194 62.15744 714.1422 0.488 0.512 277.7034 73.1 87.7 0.5 12.3 6.8 8.2 27.2 21.7 35.6 90.5 51.4 2013-2017 456.194 45.021 136.668 36.465 302.518 51.048 24163632 45341.12 117.253 338.941 77.185 61.906 170.295 141.972 4.836 64.727 NA NA NA 0.57
952800017 573 27 9 1.570681 310 54.101222 112 19.54625 12 2.094241 103 17.97557 95280 0.05348143 Goussainville 633.1666 817.7310 190.6078 38.6 49.8 11.6 18.8 5.6 1070.698 34.2 6.1 22.8 18.1 518.1815 545.7245 123.70254 302.1166 92.41590 122.52595 330.8896 92.30894 1063.9060 0.487 0.513 447.8535 67.5 91.1 0.1 8.9 6.2 25.9 10.7 26.8 30.3 81.9 60.1 2018-2022 408.722 62.421 55.010 103.801 215.906 66.923 28412402 32986.54 126.469 282.253 0.000 0.000 1.077 407.645 0.000 174.852 8 5.9 5 0.45
311210001 43 2 1 2.325581 4 9.302326 15 34.88372 4 9.302326 17 39.53488 31121 1.00000000 Castéra-Vignoles 16.0000 27.0000 22.0000 24.6 41.5 33.8 3.2 22.1 NA NA NA NA NA 15.0000 16.0000 4.00000 11.0000 0.00000 2.00000 10.0000 4.00000 31.0000 0.484 0.516 5.0000 80.6 0.0 0.0 100.0 100.0 0.0 0.0 0.0 0.0 95.2 83.3 2013-2017 27.170 3.762 8.509 1.353 22.638 3.183 1339856 3692.57 1.277 25.893 17.570 0.238 1.538 7.736 0.088 0.000 NA NA NA 0.70

Observons rapidement la répartition des richesses en fonction des votes:

On constate qu’effectivement le niveau de vie semble impacter le pourcentage de voix d’extrême gauche mais n’explique pas tout. Pour ce qui est de l’extrème droite, on observe une grande répartition donc le niveau de vie ne semble pas un facteur premier. Mais il y a tout de même cette tendance, ce qui laisse penser que la pauvreté pousse à voté dans les extrêmes.

Comparons maintenant avec notre score :

Nous cherchons une diagonale allant de l’angle inférieur gauche vers l’angle supérieur droit. Ce n’est pas le cas ici, ce qui indique que l’influence de la richesse sur les votes n’est pas significative lorsqu’elle est observée isolément. En revanche, notre théorie est confirmée : plus le niveau de richesse est faible, plus les votes pour les extrêmes augmentent.

En conclusion, la richesse permet simplement d’expliquer qu’un niveau de vie bas est associé à une probabilité plus élevée de vote pour les extrêmes.

4.2 Impact du nombre d’individu

Beaucoup de variable étant des quantités, il est intéressant de plutôt utiliser des proportions. Il faut également supprimer les colonnes inutiles car déjà représenté par d’autres (ex: Taux homme et Nb d’homme).

##   code_bureau_vote votants pourcentage_voix_votant_eg pourcentage_voix_votant_g
## 1        010010001     508                   5.708661                  24.60630
## 2        010020001     179                   9.497207                  27.37430
## 3        010040001     800                  14.750000                  28.37500
## 4        010040002     869                  12.773303                  27.61795
## 5        010040003     846                  13.120567                  29.66903
## 6        010040004     828                  13.043478                  27.53623
##   pourcentage_voix_votant_c pourcentage_voix_votant_d
## 1                 10.629921                  32.48031
## 2                 12.290503                  26.81564
## 3                  9.250000                  21.62500
## 4                  7.479862                  27.27273
## 5                  8.865248                  25.88652
## 6                  7.971014                  28.74396
##   pourcentage_voix_votant_ed prop_25 prop_25_64 prop_65 taux_nat taux_mort
## 1                   24.80315    31.5       52.2    16.3     13.0       7.1
## 2                   21.22905    26.5       56.0    17.5     18.6      11.4
## 3                   23.62500    34.6       50.3    15.1     14.2       7.6
## 4                   22.78481    34.6       50.3    15.1     14.2       7.6
## 5                   21.04019    34.6       50.3    15.1     14.2       7.6
## 6                   21.01449    34.6       50.3    15.1     14.2       7.6
##   part_non_peu_diplomes part_bepc_brevet part_cap_bep part_bac proportion_h
## 1                  27.4              5.8         25.4     16.8        0.515
## 2                  15.6              3.4         22.3     18.4        0.511
## 3                  28.1              6.7         24.5     18.6        0.511
## 4                  28.1              6.7         24.5     18.6        0.511
## 5                  28.1              6.7         24.5     18.6        0.511
## 6                  28.1              6.7         24.5     18.6        0.511
##   proportion_f taux_activite part_emplois_salaries part_agriculteurs
## 1        0.485          74.9                  64.4              18.8
## 2        0.489          78.5                  44.4              51.5
## 3        0.489          74.4                  90.6               0.1
## 4        0.489          74.4                  90.6               0.1
## 5        0.489          74.4                  90.6               0.1
## 6        0.489          74.4                  90.6               0.1
##   part_emplois_non_salaries part_artisans part_commercants
## 1                      35.6           0.0              9.4
## 2                      55.6           0.0              0.0
## 3                       9.4           5.5             11.2
## 4                       9.4           5.5             11.2
## 5                       9.4           5.5             11.2
## 6                       9.4           5.5             11.2
##   part_chefs_entreprise part_cadres part_prof_intermediaires part_employes
## 1                  15.4        37.7                     18.7          37.3
## 2                  48.5         0.0                      0.0          61.1
## 3                  26.9        33.0                     23.4          55.2
## 4                  26.9        33.0                     23.4          55.2
## 5                  26.9        33.0                     23.4          55.2
## 6                  26.9        33.0                     23.4          55.2
##   part_ouvriers    annees part_bac2 part_bac3_4 part_bac5_plus
## 1          95.1 2008-2012        NA          NA             NA
## 2          92.2 2008-2012        NA          NA             NA
## 3          90.3 2008-2012        NA          NA             NA
## 4          90.3 2008-2012        NA          NA             NA
## 5          90.3 2008-2012        NA          NA             NA
## 6          90.3 2008-2012        NA          NA             NA
##   score_orientation non_exp_prop_votants nb_non_scolarises_prop_votants
## 1              0.62           0.01771654                      1.0925197
## 2              0.56           0.02793296                      0.9441341
## 3              0.53           0.02375000                      1.5074535
## 4              0.55           0.02071346                      1.5074535
## 5              0.53           0.01418440                      1.5074535
## 6              0.54           0.01690821                      1.5074535
##   niveau_vie_total_prop_votants nb_menages_prop_votants
## 1                            NA                      NA
## 2                            NA                      NA
## 3                            NA                      NA
## 4                            NA                      NA
## 5                            NA                      NA
## 6                            NA                      NA
##   nb_emplois_lt_prop_votants nb_menages_pauvres_prop_nb_menages
## 1                 0.14370079                                 NA
## 2                 0.09497207                                 NA
## 3                 1.18626095                                 NA
## 4                 1.18626095                                 NA
## 5                 1.18626095                                 NA
## 6                 1.18626095                                 NA
##   nb_menages_seul_prop_nb_menages nb_menages_5plus_prop_nb_menages
## 1                              NA                               NA
## 2                              NA                               NA
## 3                              NA                               NA
## 4                              NA                               NA
## 5                              NA                               NA
## 6                              NA                               NA
##   nb_menages_proprietaires_prop_nb_menages
## 1                                       NA
## 2                                       NA
## 3                                       NA
## 4                                       NA
## 5                                       NA
## 6                                       NA
##   nb_menages_monoparentaux_prop_nb_menages
## 1                                       NA
## 2                                       NA
## 3                                       NA
## 4                                       NA
## 5                                       NA
## 6                                       NA
##   surface_totale_logements_prop_nb_menages
## 1                                       NA
## 2                                       NA
## 3                                       NA
## 4                                       NA
## 5                                       NA
## 6                                       NA
##   nb_logements_collectifs_prop_nb_menages nb_logements_maisons_prop_nb_menages
## 1                                      NA                                   NA
## 2                                      NA                                   NA
## 3                                      NA                                   NA
## 4                                      NA                                   NA
## 5                                      NA                                   NA
## 6                                      NA                                   NA
##   nb_log_avant_1945_prop_nb_menages nb_log_1945_1969_prop_nb_menages
## 1                                NA                               NA
## 2                                NA                               NA
## 3                                NA                               NA
## 4                                NA                               NA
## 5                                NA                               NA
## 6                                NA                               NA
##   nb_log_1970_1989_prop_nb_menages nb_log_apres_1990_prop_nb_menages
## 1                               NA                                NA
## 2                               NA                                NA
## 3                               NA                                NA
## 4                               NA                                NA
## 5                               NA                                NA
## 6                               NA                                NA
##   nb_log_date_inconnue_prop_nb_menages nb_logements_sociaux_prop_nb_menages
## 1                                   NA                                   NA
## 2                                   NA                                   NA
## 3                                   NA                                   NA
## 4                                   NA                                   NA
## 5                                   NA                                   NA
## 6                                   NA                                   NA

4.3 Recherche globale

4.3.1 Par visualisation

Comme nous l’avons vu précédemment, il est intéressant de ploter notre score face à nos différentes données, nous allons donc tous les tester rapidement et essayer d’observer.

Cette matrice de graphiques en dispersions nous donne un bonne aperçu de quel variables seront intéressantes à étudier.

5 Visualisation par la carte

Après avoir fusionné toutes les données issues des élections présidentielles de 2012, 2017 et 2022, nous avons construit des cartes géographiques illustrant l’évolution de l’intention de vote des Français au fil du temps. Ces cartes mettent en évidence les changements significatifs dans les orientations politiques de l’électorat, avec une représentation des zones dominées par les votes à droite (teintes bleues) et à gauche (teintes rouges).

En analysant les cartes de 2012, 2017 et 2022, nous pouvons observer un basculement marqué vers la droite dans de nombreuses régions, particulièrement dans le Nord-Est de la France. Toutefois, certaines régions, comme la Bretagne, conservent une stabilité de vote à gauche.

Cette transition dans les résultats électoraux nous invite à explorer plus en détail les facteurs sous-jacents à ces changements, notamment en cherchant des corrélations entre différentes variables socio-économiques et les tendances politiques observées.

6 Recherche de corrélations poussées

6.1 Random forest (via ranger)

6.1.1 Entrainement

# Préparation des données
df_model <- clean_data %>%
  group_by(code_bureau_vote) %>%
  slice_sample(n = 1) %>%
  ungroup() %>%
  select(where(is.numeric)) %>%
  select(-contains("voix")) %>%
  filter(!is.na(score_orientation)) %>%
  slice_sample(n = 100)

write.csv(df_model, file = "big_score_training_data.csv", row.names = FALSE)

nzv <- nearZeroVar(df_model, saveMetrics = TRUE)
df_model <- df_model[, !nzv$nzv]

preProcValues <- preProcess(df_model, method = "medianImpute")
df_model <- predict(preProcValues, df_model)

num_cores <- parallel::detectCores() - 1
cl <- makeCluster(num_cores)
registerDoParallel(cl)

train_ctrl <- trainControl(
  method        = "repeatedcv",
  number        = 5,
  repeats       = 3,
  verboseIter   = TRUE,
  allowParallel = FALSE
)

tune_grid <- expand.grid(
 mtry          = c(2, 4, 6, 8),
 splitrule     = c("variance", "extratrees"),
 min.node.size = c(5, 10, 15)
)

df_model <- as.data.frame(df_model)
X <- df_model[, setdiff(names(df_model), "score_orientation")]
Y <- df_model$score_orientation

set.seed(123)
rf_model <- train(
 x          = X,
 y          = Y,
 method     = "ranger",
 trControl  = train_ctrl,
 tuneGrid   = tune_grid,
 num.trees  = 500,
 importance = "impurity"
)

stopCluster(cl)
saveRDS(rf_model, file = "big_score_model.rds")

6.2 Etude du modèle

On commence par extraire les variables significatives de la random forest :

# Charger le modèle depuis le fichier RDS
rf_model <- readRDS("big_score_model.rds")

# Extraire l'importance des variables
importance_vars <- varImp(rf_model, scale = FALSE)
importance_df <- as.data.frame(importance_vars$importance)
importance_df$variable <- rownames(importance_df)

# Trier par importance décroissante
importance_df <- importance_df[order(-importance_df$Overall), ]

# Choisir un seuil d'importance (exemple : garder les variables dont l'importance est supérieure à 5% du max)
seuil <- 0.05 * max(importance_df$Overall)
selected_vars <- importance_df[importance_df$Overall >= seuil, ]
selected_vars

Puis on peut essayer d’analyser des profils types et les variables qui influent :

# Charger le dataset depuis le fichier CSV
model_data <- read.csv("big_score_training_data.csv")

# Sélection des colonnes utilisées dans le modèle
model_vars <- setdiff(colnames(model_data), "score_orientation")

# Fonction pour extraire plusieurs observations par tranche de `score_orientation`
extract_observations_group <- function(data, lower_bound, upper_bound, model_vars, n = 20) {
  data %>%
    filter(score_orientation >= lower_bound, score_orientation < upper_bound) %>%
    select(all_of(c(model_vars, "score_orientation"))) %>%
    slice_sample(n = n)  # Prendre des observations aléatoires
}

# Création des 5 groupes d'observations
X_group1 <- extract_observations_group(model_data, 0.0, 0.2, model_vars, n = 20)
X_group2 <- extract_observations_group(model_data, 0.2, 0.4, model_vars, n = 20)
X_group3 <- extract_observations_group(model_data, 0.4, 0.6, model_vars, n = 20)
X_group4 <- extract_observations_group(model_data, 0.6, 0.8, model_vars, n = 20)
X_group5 <- extract_observations_group(model_data, 0.8, 1.0, model_vars, n = 20)

# Fonction pour calculer la moyenne des valeurs SHAP pour un groupe d'observations
compute_shapley_mean <- function(predictor, x_interest_group) {
  shapley_results <- lapply(1:nrow(x_interest_group), function(i) {
    x_interest <- x_interest_group[i, , drop = FALSE]
    shapley <- Shapley$new(predictor, x.interest = x_interest)
    shapley$results %>% mutate(observation_id = i)
  })
  
  shapley_combined <- do.call(rbind, shapley_results)
  shapley_mean <- shapley_combined %>%
    group_by(feature) %>%
    summarise(mean_phi = mean(abs(phi)), .groups = 'drop')
  
  return(shapley_mean)
}

# Calcul des valeurs SHAP moyennes pour chaque groupe
shapley_mean1 <- compute_shapley_mean(predictor, X_group1)
shapley_mean2 <- compute_shapley_mean(predictor, X_group2)
shapley_mean3 <- compute_shapley_mean(predictor, X_group3)
shapley_mean4 <- compute_shapley_mean(predictor, X_group4)
shapley_mean5 <- compute_shapley_mean(predictor, X_group5)

# Visualisation des profils types par tranche
plot_shapley_profile <- function(shapley_mean, title) {
  ggplot(shapley_mean, aes(x = reorder(feature, -mean_phi), y = mean_phi)) +
    geom_bar(stat = "identity", fill = "steelblue") +
    coord_flip() +
    labs(title = title, x = "Feature", y = "Valeur SHAP moyenne (abs)") +
    theme_minimal()
}

# Plots des profils types pour chaque tranche
plot_shapley_profile(shapley_mean1, "Profil type pour la tranche [0.0 - 0.2[")
plot_shapley_profile(shapley_mean2, "Profil type pour la tranche [0.2 - 0.4[")
plot_shapley_profile(shapley_mean3, "Profil type pour la tranche [0.4 - 0.6[")
plot_shapley_profile(shapley_mean4, "Profil type pour la tranche [0.6 - 0.8[")
plot_shapley_profile(shapley_mean5, "Profil type pour la tranche [0.8 - 1.0]")

# Fonction pour calculer la moyenne des valeurs SHAP par groupe de variables
compute_shapley_influence <- function(shapley_means) {
  shapley_means %>%
    mutate(Group = case_when(
      grepl("prop|population", feature) ~ "Démographie",
      grepl("emplois|ouvriers|employes", feature) ~ "Emploi",
      grepl("menages|logements", feature) ~ "Habitation",
      TRUE ~ "Autre"
    )) %>%
    group_by(Group) %>%
    summarise(
      mean_phi = mean(mean_phi),
      sd_phi = sd(mean_phi),
      .groups = 'drop'
    ) %>%
    arrange(desc(mean_phi))
}

# Calculer les moyennes SHAP pour chaque groupe d'observations
shapley_mean1_grouped <- compute_shapley_influence(shapley_mean1)
shapley_mean2_grouped <- compute_shapley_influence(shapley_mean2)
shapley_mean3_grouped <- compute_shapley_influence(shapley_mean3)
shapley_mean4_grouped <- compute_shapley_influence(shapley_mean4)
shapley_mean5_grouped <- compute_shapley_influence(shapley_mean5)

# Visualisation de la dispersion des valeurs SHAP par groupe
plot_group_distribution <- function(shapley_means, title) {
  ggplot(shapley_means, aes(x = Group, y = mean_phi, fill = Group)) +
    geom_boxplot(outlier.color = "red", outlier.shape = 1) +
    geom_jitter(width = 0.2, alpha = 0.5) +
    labs(
      title = title,
      x = "Groupes de variables",
      y = "Valeur SHAP (importance absolue)"
    ) +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5))
}

# Plots pour chaque tranche de score
plot_group_distribution(shapley_mean1_grouped, "Distribution des valeurs SHAP [0.0 - 0.2[")
plot_group_distribution(shapley_mean2_grouped, "Distribution des valeurs SHAP [0.2 - 0.4[")
plot_group_distribution(shapley_mean3_grouped, "Distribution des valeurs SHAP [0.4 - 0.6[")
plot_group_distribution(shapley_mean4_grouped, "Distribution des valeurs SHAP [0.6 - 0.8[")
plot_group_distribution(shapley_mean5_grouped, "Distribution des valeurs SHAP [0.8 - 1.0]")

7 Synthèse